#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>


char buf[100] = {0};
int flag = 0;

sem_t sem;

// 子线程程序，作用是统计buf中的字符个数并打印
void *thread_func (void *arg) {
    // 子线程首先应该有个循环
    // 循环中阻塞在等待主线程激活的时候，子线程被激活后就去获取buf中的字符
    // 长度，然后打印；完成后再次被阻塞
    // 如果对一个值为0的信号量调用sem_wait()，这个函数就会原地等待直到有其它线程增加了这个值使它不再是0为止
    sem_wait(&sem);

    while (flag == 0) {
        printf("长度为: %ld\n", strlen(buf));
        memset(buf, 0, sizeof(buf));
        sem_wait(&sem);
    }

    pthread_exit(NULL);
}
 
 
int main(void) {
    int ret = -1;

    pthread_t thread;

    sem_init(&sem, 0, 0);
 
    // 创建子线程
    ret = pthread_create(&thread, NULL, thread_func, NULL);

    if (ret != 0) {
        printf("pthread_create error\n");
        return -1;
    }
 
    printf("输入一个字符串, 以回车结束.\n");

    while (scanf("%s", buf)) {
        // 去比较用户输入的是不是end，如果是则退出，如果不是则继续 
        if (!strncmp(buf, "end", 3)) {
            printf("输入的字符串为：%s", buf);
            flag = 1;
            sem_post(&sem);
            break;
        }

        // 主线程在收到用户收入的字符串，并且确认不是end后就去发信号激活子线程来计数。
        // 子线程被阻塞，主线程可以激活，这就是线程的同步问题。
        // 信号量就可以用来实现这个线程同步 
        sem_post(&sem);
    }
 
    return 0;
}
